#include "eeprom.h"


///*----------------------------
//Software delay function
//----------------------------*/
//void Delay(uchar n)
//{
//	uint x;
//	while(n--)
//	{
//		x = 0;
//		while(++x);
//	}
//}


/*----------------------------
Disable ISP/IAP/EEPROM function
Make MCU in a safe state
----------------------------*/
void IapIdle()
{
	IAP_CONTR = 0; //Close IAP function
	IAP_CMD = 0; //Clear command to standby
	IAP_TRIG = 0; //Clear trigger register
	IAP_ADDRH = 0x80; //Data ptr point to non-EEPROM area
	IAP_ADDRL = 0; //Clear IAP address to prevent misuse
}


/*----------------------------
Read one byte from ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
Output:Flash data
----------------------------*/
uchar IapReadByte(uint addr)
{
	uchar dat;  //Data buffer
	
	IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
	IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command
	IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
	IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
	IAP_TRIG = 0x46; //Send trigger command1 (0x46)
	IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
	_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
	dat = IAP_DATA; //Read ISP/IAP/EEPROM data
	IapIdle(); //Close ISP/IAP/EEPROM function
	
	return dat; //Return Flash data
}


/*----------------------------
Program one byte to ISP/IAP/EEPROM area
Input: addr (ISP/IAP/EEPROM address)
dat (ISP/IAP/EEPROM data)
Output:-
----------------------------*/
void IapProgramByte(uint addr, uchar dat)
{
	IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
	IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command
	IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
	IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
	IAP_DATA = dat; //Write ISP/IAP/EEPROM data
	IAP_TRIG = 0x46; //Send trigger command1 (0x46)
	IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
	_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
	IapIdle();
}


/*----------------------------
Erase one sector area
Input: addr (ISP/IAP/EEPROM address)
Output:-
----------------------------*/
void IapEraseSector(uint addr)
{
	IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time
	IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command
	IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low
	IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high
	IAP_TRIG = 0x46; //Send trigger command1 (0x46)
	IAP_TRIG = 0xb9; //Send trigger command2 (0xb9)
	_nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete
	IapIdle();
}
